#SSH 远程
#简介
PowerShell 7 支持基于 SSH 的远程处理。与 WinRM 相比,SSH 传输天然跨平台,可以在 Windows、Linux 和 macOS 之间建立远程会话。使用 SSH 时,New-PSSession、Invoke-Command 和 Enter-PSSession 需要改用 -HostName 参数,而不是 Windows 上的 -ComputerName。
#前提条件
目标计算机需要满足:
- 安装并运行 OpenSSH Server(
sshd)。 - 安装 PowerShell 7(
pwsh)。 - 在 SSH 配置中注册 PowerShell 子系统。
在 Linux 上,编辑 /etc/ssh/sshd_config,加入:
# /etc/ssh/sshd_config
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
在 Windows 上,配置文件通常位于 C:\ProgramData\ssh\sshd_config,子系统路径应指向 pwsh.exe 的完整路径。
修改后重启 SSH 服务。Linux 上常见命令:
$ sudo systemctl restart sshd
-sshs 表示以 SSH 子系统模式运行 PowerShell,-NoLogo 用于关闭启动徽标。客户端需要安装 OpenSSH 客户端,并能够通过密钥或密码登录目标计算机。
#创建 SSH 会话
使用 New-PSSession -HostName 建立 SSH 远程会话:
> $session = New-PSSession -HostName server01 -UserName alice
默认使用 22 端口;也可以指定端口或密钥:
> $session = New-PSSession -HostName server01 -UserName alice -Port 2222
> $session = New-PSSession -HostName server01 -UserName alice -KeyFilePath ~/.ssh/id_ed25519
未指定密钥时,PowerShell 会按照 SSH 的方式提示输入密码,或使用已加载到 ssh-agent 中的密钥。
#执行远程命令
使用 Invoke-Command -HostName 执行一次性远程命令:
> Invoke-Command -HostName server01 -UserName alice -ScriptBlock {
Get-Date
$PSVersionTable.PSVersion
}
复用已建立的会话:
> Invoke-Command -Session $session -ScriptBlock { hostname }
向脚本块传递参数:
> Invoke-Command -Session $session -ScriptBlock {
param($Path)
Get-ChildItem -Path $Path
} -ArgumentList '/var/log'
#交互式 SSH 会话
使用 Enter-PSSession -HostName 进入远程交互式会话:
> Enter-PSSession -HostName server01 -UserName alice
退出时执行:
[server01]: PS> Exit-PSSession
#注意事项
- SSH 远程会话中的命令在目标计算机的登录用户权限下运行。
- 推荐使用密钥认证,并妥善保护私钥文件权限。
- Windows 目标机需要通过“可选功能”安装 OpenSSH Server。
- 修改
sshd_config后必须重启 SSH 服务,否则 PowerShell 子系统不会生效。 - 如果连接失败,可先使用系统
ssh客户端验证网络和登录是否正常。